package com.linkgie.galaxyframework.log;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Log {

	/**
	 * 日志消息模板；
	 * <p>
	 * 
	 * 等同于 {@link #message()} ；
	 * 
	 * @return
	 */
	String value() default "";

	/**
	 * 日志消息模板；
	 * <p>
	 * 
	 * 等同于 {@link #value()} ；
	 * <p>
	 * 
	 * 可以采用表达式引用上下文的变量，表达式包含在字符 [[ 和 ]] 之间，以 ${ expression } 格式表示;
	 * <p>
	 * 上下文设置了 3 个默认变量：<br>
	 * （1）args : 表示方法调用传递的参数列表;<br>
	 * （2）result : 表示方法调用的返回结果；<br>
	 * （3）error : 表示方法调用引发的异常；<br>
	 * 
	 * <p>
	 * 例如 <br>
	 * 例1. 引用第 1 个参数：${args[0]} ； <br>
	 * 完整的消息模板： "This is a log message template [[${args[0]}]] ."
	 * <p>
	 * 
	 * 例2. 用短线连接第1个和第2个参数：${args[0] + '-' + args[1]} <br>
	 * 完整的消息模板： "This is a log message template [[${args[0] + '-' + args[1]}]] ."
	 * <p>
	 * 例3. 引用返回值的 name 属性： ${result.name} <br>
	 * 完整的消息模板： "This is a log message template [[${result.name}]] ."
	 * <p>
	 * @return
	 */
	String message() default "";

	/**
	 * 业务领域；
	 * 
	 * @return
	 */
	String domain() default "";

	/**
	 * 是否在调用前触发日志记录；
	 * <p>
	 * 默认为 false；
	 * 
	 * @return
	 */
	boolean preTrigger() default false;

	/**
	 * 是否在调用后触发日志记录；
	 * <p>
	 * 默认为 true ；
	 * 
	 * @return
	 */
	boolean postTrigger() default true;

	/**
	 * 输出消息的日志级别；
	 * <p>
	 * 
	 * 默认为 INFO ；
	 * 
	 * @return
	 */
	LogLevel level() default LogLevel.INFO;
	
	/**
	 * 错误日志消息模板；
	 * <p>
	 * 当发生错误时，采用此属性设置的模板生成日志消息；
	 * <p>
	 * 如果此属性未设置，则采用 {@link #message()} 属性设置的内容；
	 * 
	 * <p>
	 * 默认值为空；
	 * 
	 * @return
	 */
	String errorMessage() default "";
	

	/**
	 * 错误消息的日志级别；
	 * <p>
	 * 
	 * 当输出错误日志时，采用此属性设置的日志级别输出错误日志消息；<p>
	 * 
	 * 默认为 ERROR ；
	 * 
	 * @return
	 */
	LogLevel errorLevel() default LogLevel.ERROR;

	/**
	 * 是否输出审计信息；
	 * <p>
	 * 设置为 true 时，输出日志的上下文包含审计信息，变量名为 audition，审计信息中包含当前机构、操作账号、时间等信息；<p>
	 * 
	 * 默认为 true ；
	 * @return
	 */
	boolean auditble() default true;

	/**
	 * 是否输出文件日志；
	 * <p>
	 * 默认为 false；
	 *
	 * @return
	 */
	boolean fileLogging() default false;
}
